#include "Configuration.hpp"
#include <string.h>
#include <iostream>
#include <sstream>
#include <fstream>
using std::cout;
using std::endl;
using namespace std;
namespace wd
{
//获取单例的实例,将创建好的对象暴露出去
Configuration * Configuration::getInstance()
{
  static Configuration instance;
  return &instance;
}
//从配置文件中加载配置,获取value
void Configuration::loadConfig(const string & filename)
{
   //先打开文件
    std::ifstream file(filename);
   //判断是否打开错误
   if(!file.is_open())
   {
      cerr<<"can not open this file"<<endl;
      return;
   }
   string line;
   while(getline(file,line))
   {
       if(line.empty()||line[0]=='#')
       {
           continue;
       }
       //找到第一个非空白字符作为key的开始
       size_t key_start=line.find_first_not_of(" \t");
       if(key_start==string::npos)continue;
       //找到key的结束（第一个空白字符）
       size_t key_end=line.find_first_of(" \t",key_start);
       if(key_end==string::npos)continue;

       //提取key
       string key=line.substr(key_start,key_end-key_start);

       //找到value的开始第一个空字符
       size_t value_start=line.find_first_not_of(" \t",key_end);
       if(key_end==string::npos)continue;

       //提取value
       string value=line.substr(value_start);
       
       //去除value末尾的空白
       size_t value_end=value.find_last_not_of(" \t");
       if(value_end!=string::npos)
       {
           value=value.substr(0,value_end+1);
       }

       _map[key]=value;
       cout<<"Loaded config"<<key<<"="<<value<<endl; 
   }
   file.close();
}
//获取配置的值key
string Configuration::get(const string & key)const
{
   auto it=_map.find(key);
   if(it==_map.end())
   {
     cerr<<"can not open this file"<<endl;
   return "";
   }
   return it->second;//返回找到的值
}
}

